/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.eclipse.dltk.internal.ui.refactoring.reorg; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.internal.corext.refactoring.IInternalRefactoringProcessorIds; import org.eclipse.dltk.internal.corext.refactoring.RefactoringCoreMessages; import org.eclipse.dltk.internal.corext.refactoring.changes.DynamicValidationStateChange; import org.eclipse.dltk.internal.corext.refactoring.participants.ResourceProcessors; import org.eclipse.dltk.internal.corext.refactoring.participants.ScriptProcessors; import org.eclipse.dltk.internal.corext.refactoring.reorg.INewNameQueries; import org.eclipse.dltk.internal.corext.refactoring.reorg.IReorgDestinationValidator; import org.eclipse.dltk.internal.corext.refactoring.reorg.IReorgPolicy.ICopyPolicy; import org.eclipse.dltk.internal.corext.refactoring.reorg.IReorgQueries; import org.eclipse.dltk.internal.corext.refactoring.reorg.MonitoringNewNameQueries; import org.eclipse.dltk.internal.corext.refactoring.reorg.ParentChecker; import org.eclipse.dltk.internal.corext.refactoring.reorg.ReorgPolicyFactory; import org.eclipse.dltk.internal.corext.refactoring.reorg.ReorgUtils; import org.eclipse.dltk.internal.corext.refactoring.tagging.ICommentProvider; import org.eclipse.dltk.internal.corext.util.Resources; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; import org.eclipse.ltk.core.refactoring.participants.CopyProcessor; import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant; import org.eclipse.ltk.core.refactoring.participants.ReorgExecutionLog; import org.eclipse.ltk.core.refactoring.participants.SharableParticipants; public final class ScriptCopyProcessor extends CopyProcessor implements IReorgDestinationValidator, ICommentProvider { // TODO: offer ICopyPolicy getCopyPolicy(); IReorgPolicy getReorgPolicy(); // and remove delegate methods (also for ScriptMoveProcessor)? private INewNameQueries fNewNameQueries; private IReorgQueries fReorgQueries; private ICopyPolicy fCopyPolicy; private ReorgExecutionLog fExecutionLog; private String fComment; public static ScriptCopyProcessor create(IResource[] resources, IModelElement[] modelElements) throws ModelException { ICopyPolicy copyPolicy = ReorgPolicyFactory.createCopyPolicy(resources, modelElements); if (!copyPolicy.canEnable()) return null; return new ScriptCopyProcessor(copyPolicy); } public ScriptCopyProcessor(ICopyPolicy copyPolicy) { fCopyPolicy = copyPolicy; } @Override public String getProcessorName() { return RefactoringCoreMessages.ScriptCopyProcessor_processorName; } @Override public String getIdentifier() { return IInternalRefactoringProcessorIds.COPY_PROCESSOR; } @Override public boolean isApplicable() throws CoreException { return fCopyPolicy.canEnable(); } public void setNewNameQueries(INewNameQueries newNameQueries) { Assert.isNotNull(newNameQueries); fNewNameQueries = newNameQueries; } public void setReorgQueries(IReorgQueries queries) { Assert.isNotNull(queries); fReorgQueries = queries; } public IModelElement[] getScriptElements() { return fCopyPolicy.getScriptElements(); } public IResource[] getResources() { return fCopyPolicy.getResources(); } @Override public Object[] getElements() { IModelElement[] jElements = fCopyPolicy.getScriptElements(); IResource[] resources = fCopyPolicy.getResources(); List result = new ArrayList(jElements.length + resources.length); result.addAll(Arrays.asList(jElements)); result.addAll(Arrays.asList(resources)); return result.toArray(); } @Override public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException { RefactoringStatus result = new RefactoringStatus(); result.merge(RefactoringStatus.create(Resources.checkInSync( ReorgUtils.getNotNulls(fCopyPolicy.getResources())))); IResource[] javaResources = ReorgUtils .getResources(fCopyPolicy.getScriptElements()); result.merge(RefactoringStatus.create( Resources.checkInSync(ReorgUtils.getNotNulls(javaResources)))); return result; } public Object getCommonParentForInputElements() { return new ParentChecker(fCopyPolicy.getResources(), fCopyPolicy.getScriptElements()).getCommonParent(); } public RefactoringStatus setDestination(IModelElement destination) throws ModelException { return fCopyPolicy.setDestination(destination); } public RefactoringStatus setDestination(IResource destination) throws ModelException { return fCopyPolicy.setDestination(destination); } @Override public boolean canChildrenBeDestinations(IModelElement modelElement) { return fCopyPolicy.canChildrenBeDestinations(modelElement); } @Override public boolean canChildrenBeDestinations(IResource resource) { return fCopyPolicy.canChildrenBeDestinations(resource); } @Override public boolean canElementBeDestination(IModelElement modelElement) { return fCopyPolicy.canElementBeDestination(modelElement); } @Override public boolean canElementBeDestination(IResource resource) { return fCopyPolicy.canElementBeDestination(resource); } @Override public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException { Assert.isNotNull(fNewNameQueries, "Missing new name queries"); //$NON-NLS-1$ Assert.isNotNull(fReorgQueries, "Missing reorg queries"); //$NON-NLS-1$ pm.beginTask("", 2); //$NON-NLS-1$ RefactoringStatus result = fCopyPolicy.checkFinalConditions( new SubProgressMonitor(pm, 1), context, fReorgQueries); result.merge(context.check(new SubProgressMonitor(pm, 1))); return result; } @Override public Change createChange(IProgressMonitor pm) throws CoreException { Assert.isNotNull(fNewNameQueries); Assert.isTrue(fCopyPolicy.getScriptElementDestination() == null || fCopyPolicy.getResourceDestination() == null); Assert.isTrue(fCopyPolicy.getScriptElementDestination() != null || fCopyPolicy.getResourceDestination() != null); try { final DynamicValidationStateChange result = new DynamicValidationStateChange( getChangeName()) { @Override public Change perform(IProgressMonitor pm2) throws CoreException { try { super.perform(pm2); } catch (OperationCanceledException e) { fExecutionLog.markAsCanceled(); throw e; } return null; } @SuppressWarnings("unchecked") @Override public <T> T getAdapter(Class<T> adapter) { if (ReorgExecutionLog.class.equals(adapter)) return (T) fExecutionLog; return super.getAdapter(adapter); } }; Change change = fCopyPolicy.createChange(pm, new MonitoringNewNameQueries(fNewNameQueries, fExecutionLog)); if (change instanceof CompositeChange) { CompositeChange subComposite = (CompositeChange) change; result.merge(subComposite); } else { result.add(change); } return result; } finally { pm.done(); } } private String getChangeName() { return RefactoringCoreMessages.ScriptCopyProcessor_changeName; } @Override public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants) throws CoreException { RefactoringParticipant[] result = fCopyPolicy.loadParticipants(status, this, getAffectedProjectNatures(), sharedParticipants); fExecutionLog = fCopyPolicy.getReorgExecutionLog(); return result; } private String[] getAffectedProjectNatures() throws CoreException { String[] jNatures = ScriptProcessors .computeAffectedNaturs(fCopyPolicy.getScriptElements()); String[] rNatures = ResourceProcessors .computeAffectedNatures(fCopyPolicy.getResources()); Set<String> result = new HashSet<>(); result.addAll(Arrays.asList(jNatures)); result.addAll(Arrays.asList(rNatures)); return result.toArray(new String[result.size()]); } @Override public boolean canEnableComment() { return true; } @Override public String getComment() { return fComment; } @Override public void setComment(String comment) { fComment = comment; } }